//
// 哈夫曼树
// Created by 麻再挺 on 2021/12/15.
//

#ifndef DATA_STRUCTURE_C_HUFFMAN_TREE_H
#define DATA_STRUCTURE_C_HUFFMAN_TREE_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./../constant.h"

/**
 * 哈夫曼树结构
 */
typedef struct {
    // 权重
    int weight;
    // 父节点, 左右孩子节点坐标
    int parent, left, right;
} HTNode, *HuffmanTree;

// 动态二维数组, 存放哈夫曼编码
typedef char **HuffmanCode;

/**
 * 创建哈夫曼树
 * @param t 树
 * @param w 节点数组
 * @param n 长度
 */
void CreateHuffmanTree(HuffmanTree *t, int *w, int n);

/**
 * 打印
 * @param t 哈夫曼树
 * @param n 数量
 */
void PrintHuffmanTree(HuffmanTree t, int n);

/**
 * 哈夫曼编码
 * @param t 树
 * @param code 编码
 * @param n 长度
 */
void HuffmanCoding(HuffmanTree t, HuffmanCode *code, int n);

/**
 * 输出哈夫曼编码
 * @param code 编码
 * @param w 节点
 * @param n 长度
 */
void PrintHuffmanCode(HuffmanCode code, int *w, int n);


#endif //DATA_STRUCTURE_C_HUFFMAN_TREE_H
